package com.sdi.presentation;
import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;



import com.sdi.business.AlumnosService;
import com.sdi.infrastructure.Factories;
import com.sdi.model.Alumno;

@ManagedBean(name="controller")
@SessionScoped
public class BeanAlumnos implements Serializable{
	      private static final long serialVersionUID = 55555L;
		  // Se añade este atributo de entidad para recibir el alumno concreto selecionado de la tabla o de un formulario
	      // Es necesario inicializarlo para que al entrar desde el formulario de AltaForm.xml se puedan
	      // dejar los avalores en un objeto existente.		
          private Alumno[] alumnos = null;
		  
        //uso de inyección de dependencia
 	     @ManagedProperty(value="#{alumno}") 
 	     private BeanAlumno alumno;
 	     public BeanAlumno getAlumno() { return alumno; }
 	     public void setAlumno(BeanAlumno alumno) {this.alumno = alumno;}
 	    
 	   //Se inicia correctamente el Managed Bean inyectado si JSF lo hubiera creado
 	   //y en caso contrario se crea. 
 	   //(hay que tener en cuenta que es un Bean de sesión)

 	   //Se usa @PostConstruct, ya que en el contructor no se sabe todavía si 
 	   //el MBean ya estaba construido y en @PostConstruct SI.
 	   @PostConstruct
 	   public void init() {
 	     System.out.println("BeanAlumnos - PostConstruct");
 	     //Buscamos el alumno en la sesión. Esto es un patrón factoría claramente.
 	     alumno = (BeanAlumno)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(new String("alumno"));

 	     //si no existe lo creamos e inicializamos
 	     if (alumno == null) { 
 	       System.out.println("BeanAlumnos - No existia");
 	       alumno = new BeanAlumno();
 	       FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "alumno", alumno);
 	     }
 	   }

 	   @PreDestroy
 	   public void end()
 	   {
 	     System.out.println("BeanAlumnos - PreDestroy");
 	   }
          
          
		  public Alumno[] getAlumnos () {
			    return(alumnos);
			  }
	       public void setAlumnos(Alumno[] alumnos) {
				  this.alumnos = alumnos;
		     }  
	       public String listado() {
		       AlumnosService service;
				  try {
				  // Acceso a la implementacion de la capa de negocio 
					// a trav��s de la factor��a
					service = Factories.services.createAlumnosService();
					// De esta forma le damos informaci��n a toArray para poder hacer el casting a Alumno[]
					alumnos = (Alumno [])service.getAlumnos().toArray(new Alumno[0]);
					
					return "listado"; // Nos vamos a la vista listado.
					
				  } catch (Exception e) {
					e.printStackTrace();  
					return "error";
				  }
				  
		 	  }
	       public String baja(Alumno alumno) {
		       AlumnosService service;
				  try {
				  // Acceso a la implementacion de la capa de negocio 
					// a trav��s de la factor��a
					service = Factories.services.createAlumnosService();
			      //Aliminamos el alumno seleccionado en la tabla
					service.deleteAlumno(alumno.getId());				 
				   } catch (Exception e) {
					e.printStackTrace();  
					return "error";
				  }
					
				 return listado(); 
		 	  }
	       public String edit() {
		       AlumnosService service;
				  try {
				  // Acceso a la implementacion de la capa de negocio 
					// a trav��s de la factor��a
					service = Factories.services.createAlumnosService();
			      //Recargamos el alumno seleccionado en la tabla de la base de datos por si hubiera cambios.
					alumno = (BeanAlumno) service.findById(alumno.getId());
					return "editForm";
					
				  } catch (Exception e) {
					e.printStackTrace();  
					return "error";
				  }
				  
		 	  }
	       
	       public String salva() {
		       AlumnosService service;
				  try {
				  // Acceso a la implementacion de la capa de negocio 
					// a trav��s de la factor��a
					service = Factories.services.createAlumnosService();
			      //Salvamos o actualizamos el alumno segun sea una operacion de alta o de edici��n
					if (alumno.getId() == null) {
						service.saveAlumno(alumno);
					}
					else {
						service.updateAlumno(alumno); 
					} 
				
				  } catch (Exception e) {
					  e.printStackTrace();
					return "error";
				  }
				  
				  return listado();
		 	  }
	}


	
